package com.example.demo_redis_test.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


/**
 * 动态代理：基于反射机制
 * 1.什么是动态代理
 * 2.知道动态代理能做什么？
 * 框架中的使用mybatis、spring
 * -----------------------------------
 * 1.代理：代购、中介、换IP，商家等
 *   比如美国大学，对全世界招生，留学中介（代理）
 *   留学中介（代理）：帮助这家美国的学校招生，中介是学校的代理，中介是代替学校完成招生功能
 *      代理特点：
 *          1.功能专一(招生)
 *          2.中介是学校的代理，学校是目标
 *          3.家长--中介（学校介绍，办入学手续）--美国学校
 *          4.中介是代理，不能白干活，需要收取手续费
 *          5.代理不能让你访问到目标
 *
 *       为什么要找中介（代理）？
 *          1.中介是专业的，只做一件事，方便
 *          2.家长不能自己找学校，没有能力访问学校，或者美国学校不接收和人来访
 *
 *       买家---商家---厂家
 * 2.在开发中也会有这样的情况，你有a类，本来是调用C类的方法，完成某个功能，但是C不让调用
 *    a ----不能调用C的方法
 *    在a和c直接创建一个B代理，c让b访问
 *    a--访问b--访问c
 *
 *    实际的列子：登录，注册有验证码，验证码是手机短信
 *    中国移动，联通能发送短信，面向社会提供短信的范松功能
 *    张三项目发送短信---子公司-----中国移动，联通
 * 3.代理模式的作用
 *    1.功能增强：在你原有的功能上，增加了额外的功能。新增加的功能，叫做功能增强
 *    2.控制访问：代理类不让你访问目标，列如商家不让用户访问厂家。
 * 4.实现代理的方式
 *    1.静态代理： 1）代理类是自己手工实现的，自己创建一个java，表示代理类
 *          特点：实现简单；容易理解
 *          用户（客户端）--商家（代理）---厂家（目标）
 *          商家和厂家功能一致，都是卖U盘的
 *       实现步骤：
 *          1.创建一个接口，定义卖U盘的方法，表示你的厂家和商家做的事情
 *          2.创建厂家类，实现1步骤的接口
 *          3.创建商家，就是代理，也需要实现1步骤中的接口
 *          4，创建客户端类，调用商家的方法买一个U盘
 *
 *
 */


public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    public MyInvocationHandler(Object target){
        super();
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
        System.out.println("-----------------begin "+method.getName()+"-----------------");
        Object result = method.invoke(target, args);
        System.out.println("-----------------end "+method.getName()+"-----------------");
        return result;
    }
    public Object getProxy(){
            return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    target.getClass().getInterfaces(),
                    this);
    }
}
